home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1993 April
/
CICA MS Windows - April 1993.iso
/
unzipped
/
programr
/
wincap
/
copy.c
next >
Wrap
C/C++ Source or Header
|
1991-11-05
|
9KB
|
339 lines
/*
* copy.c
*
* Source file for Device-Independent Bitmap (DIB) API. Provides
* the following functions:
*
* CopyWindowToDIB() - Copies a window to a DIB
* CopyScreenToDIB() - Copies entire screen to a DIB
* CopyWindowToBitmap()- Copies a window to a standard Bitmap
* CopyScreenToBitmap()- Copies entire screen to a standard Bitmap
*
* The following functions are called from DIBUTIL.C:
*
* DIBToBitmap() - Creates a bitmap from a DIB
* BitmapToDIB() - Creates a DIB from a bitmap
* DIBWidth() - Gets the width of the DIB
* DIBHeight() - Gets the height of the DIB
* CreateDIBPalette() - Gets the DIB's palette
* GetSystemPalette() - Gets the current palette
*
* Development Team: Mark Bader
* Patrick Schreiber
* Garrett McAuliffe
* Eric Flo
* Tony Claflin
*
* Written by Microsoft Product Support Services, Developer Support.
* Copyright (c) 1991 Microsoft Corporation. All rights reserved.
*/
/* header files */
#include <WINDOWS.H>
#include "ERRORS.H"
#include "DIBUTIL.H"
#include "DIBAPI.H"
/*************************************************************************
*
* CopyWindowToDIB()
*
* Parameters:
*
* HWND hWnd - specifies the window
*
* WORD fPrintArea - specifies the window area to copy into the device-
* independent bitmap
*
* Return Value:
*
* HDIB - identifies the device-independent bitmap
*
* Description:
*
* This function copies the specified part(s) of the window to a device-
* independent bitmap.
*
************************************************************************/
HDIB CopyWindowToDIB(HWND hWnd, WORD fPrintArea)
{
HDIB hDIB = NULL; // handle to DIB
/* check for a valid window handle */
if (!hWnd)
return NULL;
switch (fPrintArea)
{
case PW_WINDOW: // copy entire window
{
RECT rectWnd;
/* get the window rectangle */
GetWindowRect(hWnd, &rectWnd);
/* get the DIB of the window by calling
* CopyScreenToDIB and passing it the window rect
*/
hDIB = CopyScreenToDIB(&rectWnd);
}
break;
case PW_CLIENT: // copy client area
{
RECT rectClient;
POINT pt1, pt2;
/* get the client area dimensions */
GetClientRect(hWnd, &rectClient);
/* convert client coords to screen coords */
pt1.x = rectClient.left;
pt1.y = rectClient.top;
pt2.x = rectClient.right;
pt2.y = rectClient.bottom;
ClientToScreen(hWnd, &pt1);
ClientToScreen(hWnd, &pt2);
rectClient.left = pt1.x;
rectClient.top = pt1.y;
rectClient.right = pt2.x;
rectClient.bottom = pt2.y;
/* get the DIB of the client area by calling
* CopyScreenToDIB and passing it the client rect
*/
hDIB = CopyScreenToDIB(&rectClient);
}
break;
default: // invalid print area
return NULL;
}
/* return the handle to the DIB */
return hDIB;
}
/*************************************************************************
*
* CopyScreenToDIB()
*
* Parameter:
*
* LPRECT lpRect - specifies the window
*
* Return Value:
*
* HDIB - identifies the device-independent bitmap
*
* Description:
*
* This function copies the specified part of the screen to a device-
* independent bitmap.
*
************************************************************************/
HDIB CopyScreenToDIB(LPRECT lpRect)
{
HBITMAP hBitmap; // handle to device-dependent bitmap
HPALETTE hPalette; // handle to palette
HDIB hDIB = NULL; // handle to DIB
/* get the device-dependent bitmap in lpRect by calling
* CopyScreenToBitmap and passing it the rectangle to grab
*/
hBitmap = CopyScreenToBitmap(lpRect);
/* check for a valid bitmap handle */
if (!hBitmap)
return NULL;
/* get the current palette */
hPalette = GetSystemPalette();
/* convert the bitmap to a DIB */
hDIB = BitmapToDIB(hBitmap, hPalette);
/* clean up */
DeleteObject(hBitmap);
/* return handle to the packed-DIB */
return hDIB;
}
/*************************************************************************
*
* CopyWindowToBitmap()
*
* Parameters:
*
* HWND hWnd - specifies the window
*
* WORD fPrintArea - specifies the window area to copy into the device-
* dependent bitmap
*
* Return Value:
*
* HDIB - identifies the device-dependent bitmap
*
* Description:
*
* This function copies the specified part(s) of the window to a device-
* dependent bitmap.
*
************************************************************************/
HBITMAP CopyWindowToBitmap(HWND hWnd, WORD fPrintArea)
{
HBITMAP hBitmap = NULL; // handle to device-dependent bitmap
/* check for a valid window handle */
if (!hWnd)
return NULL;
switch (fPrintArea)
{
case PW_WINDOW: // copy entire window
{
RECT rectWnd;
/* get the window rectangle */
GetWindowRect(hWnd, &rectWnd);
/* get the bitmap of that window by calling
* CopyScreenToBitmap and passing it the window rect
*/
hBitmap = CopyScreenToBitmap(&rectWnd);
}
break;
case PW_CLIENT: // copy client area
{
RECT rectClient;
POINT pt1, pt2;
/* get client dimensions */
GetClientRect(hWnd, &rectClient);
/* convert client coords to screen coords */
pt1.x = rectClient.left;
pt1.y = rectClient.top;
pt2.x = rectClient.right;
pt2.y = rectClient.bottom;
ClientToScreen(hWnd, &pt1);
ClientToScreen(hWnd, &pt2);
rectClient.left = pt1.x;
rectClient.top = pt1.y;
rectClient.right = pt2.x;
rectClient.bottom = pt2.y;
/* get the bitmap of the client area by calling
* CopyScreenToBitmap and passing it the client rect
*/
hBitmap = CopyScreenToBitmap(&rectClient);
}
break;
default: // invalid print area
return NULL;
}
/* return handle to the bitmap */
return hBitmap;
}
/*************************************************************************
*
* CopyScreenToBitmap()
*
* Parameter:
*
* LPRECT lpRect - specifies the window
*
* Return Value:
*
* HDIB - identifies the device-dependent bitmap
*
* Description:
*
* This function copies the specified part of the screen to a device-
* dependent bitmap.
*
************************************************************************/
HBITMAP CopyScreenToBitmap(LPRECT lpRect)
{
HDC hScrDC, hMemDC; // screen DC and memory DC
HBITMAP hBitmap, hOldBitmap; // handles to deice-dependent bitmaps
int nX, nY, nX2, nY2; // coordinates of rectangle to grab
int nWidth, nHeight; // DIB width and height
int xScrn, yScrn; // screen resolution
/* check for an empty rectangle */
if (IsRectEmpty(lpRect))
return NULL;
/* create a DC for the screen and create
* a memory DC compatible to screen DC
*/
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hScrDC);
/* get points of rectangle to grab */
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
/* get screen resolution */
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
/* make sure bitmap rectangle is visible */
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
/* create a bitmap compatible with the screen DC */
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
/* select new bitmap into memory DC */
hOldBitmap = SelectObject(hMemDC, hBitmap);
/* bitblt screen DC to memory DC */
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
/* select old bitmap back into memory DC and get handle to
* bitmap of the screen
*/
hBitmap = SelectObject(hMemDC, hOldBitmap);
/* clean up */
DeleteDC(hScrDC);
DeleteDC(hMemDC);
/* return handle to the bitmap */
return hBitmap;
}